const { models } = require('../model')
const UserModel = models.User
const { jwtVerify } = require('../service/verify')

async function userCheck (ctx, next) {
  // 用户身份检测 _user
  const request = ctx.request
  const response = ctx.response
  const accessToken = request.headers['x-access-token'] || ctx.cookies.get('x-access-token')
  if (!accessToken) {
    return response.wrapper.error('AUTH_ERROR', '需要登陆后才能访问此数据')
  }
  let decoded = {}
  try {
    decoded = await jwtVerify(accessToken)
  } catch (err) {
    return response.wrapper.error('AUTH_ERROR', '账号登陆状态超时，请刷新页面重新登陆', err)
  }
  // Token 过期
  if (decoded.exp < (Date.now() / 1000)) {
    return response.wrapper.error('AUTH_ERROR', '登录状态已过期，请重新登录')
  }
  const user = await UserModel.findById(decoded.data._id)
  if (!user) {
    return response.wrapper.error('AUTH_ERROR', '系统无此用户，登陆状态无效')
  }
  if (user.status === 1) {
    return response.wrapper.error('AUTH_ERROR', '账号已被屏蔽')
  }
  // 请求用户信息
  ctx._user = ctx.request._user = user
  await next()
}

async function adminRequired (ctx, next) {
  const user = ctx._user || ctx._tUser
  if (user.role !== 0) {
    ctx.wrapper.error('AUTH_ERROR', '账号无后台管理权限')
    return
  }
  await next()
}

module.exports = {
  // 登陆验证
  userCheck,
  // 后台管理权限验证
  adminRequired
}
